<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <script>
        /*
        *
            JS 高级
            *  call apply  bind -> 改变this指向
            *  call 想调用的方法.(调用方法对象, 参数 1, 参数 2......)
            *  apply 想调用的方法.(调用方法对象, [参数 1, 参数 2......])
            *  bind 想调用的方法.bind(调用方法对象, 参数 1, ......) 返回一个函数，需要手动调用
            *
            * new 原理
            * 1. 创建一个空对象，取出构造函数和参数
            * 2. 改变this指向
            * 3. 修改this指向的对象的原型
            * 4. 返回对象
         */

        obj = {
            name: '张三',
            age: 18,

            show(){
                console.log(this.name + " " + this.age)
            }
        };
        obj2 = {
            name: '李四',
            age: 18,

            show(){
                console.log(this.name + " " + this.age)
            }
        };

        obj.show.call(obj2);
        obj2.show.apply(obj);
        
        function Children(like, hate, money) {
            this.like = like;
            this.hate = hate;
            this.money = money;
        }
        
        function Student(name, age) {
            this.name = name;
            this.age = age;
        }
        
        function _new() {
            // 1. 创建一个空对象
            let obj = {};
            // 取出参数
            let params = Array.prototype.slice.call(arguments, 1)
            // 2. 改变this指向
            let fn = arguments[0];
            obj = fn.apply(obj, params);

            // 3. 修改this指向的对象的原型
            obj.__proto__ = fn.prototype;
            obj.__proto__.constructor = fn;

            // 4. 返回对象
            return obj;

        }

        let student = _new(Student, '张三', 18);
        console.log(student)

        let array = [1,2,3,4,5,6,7,8,9,10];
        array.forEach()

    </script>
</body>
</html>